package com.star.oauth2.client.controller;

import com.star.oauth2.client.service.TokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

/**
 * OAuth2 回调控制器
 * 
 * 用于接收授权服务器重定向回来的授权码，自动交换访问令牌，并跳转到消息管理页面
 * 
 * @author star
 */
@Slf4j
@Controller
public class OAuth2CallbackController {

    @Autowired
    private TokenService tokenService;

    /**
     * OAuth2 回调端点
     * 
     * 访问流程：
     * 1. 用户访问授权URL并登录
     * 2. 授权服务器重定向到此端点：http://localhost:8080/callback?code=xxx&state=yyy
     * 3. 此接口自动用code交换token
     * 4. 渲染中间页面，该页面将token保存到localStorage然后自动跳转到消息页面
     * 
     * @param code 授权码
     * @param state 状态参数（用于防CSRF）
     * @param model Model对象
     * @return 渲染中间页面
     */
    @GetMapping("/callback")
    public String handleCallback(
            @RequestParam String code,
            @RequestParam(required = false) String state,
            Model model) {
        
        log.info("=================================");
        log.info("收到OAuth2回调");
        log.info("授权码: {}", code.substring(0, Math.min(code.length(), 20)) + "...");
        log.info("状态参数: {}", state);
        log.info("=================================");

        try {
            // 使用TokenService交换访问令牌
            Map<String, Object> tokenResponse = tokenService.getTokenByCode(code, "http://localhost:8080/callback");
            
            log.info("✅ 成功获取访问令牌");
            log.info("令牌类型: {}", tokenResponse.get("token_type"));
            log.info("过期时间: {} 秒", tokenResponse.get("expires_in"));
            log.info("授权范围: {}", tokenResponse.get("scope"));
            
            // 将令牌信息传递给中间页面
            model.addAttribute("tokenResponse", tokenResponse);
            model.addAttribute("authorized", true);
            
            // 渲染中间页面，该页面将保存token后跳转到messages页面
            return "auth-success";
            
        } catch (Exception e) {
            log.error("❌ 交换令牌失败", e);
            
            // 传递错误信息
            model.addAttribute("error", true);
            model.addAttribute("errorMessage", e.getMessage());
            
            // 渲染错误页面
            return "auth-error";
        }
    }
}